
export module ClassSyntax {

    // #es5 类定义
    // function Person(name) {
    //     this.name = name;
    //     this.run = function () {
    //         console.log(this.name + ' is running');
    //     }
    // }

    // ts 类定义
    // class Person {

    //     name: string    //类成员：属性 省略了public

    //     constructor(str: string) {  //构造函数，用于实例化对象
    //         this.name = str
    //     }

    //     run():void { //类成员：方法
    //         console.log(this.name + ' is running!');
    //     }
    // }

    // 带get和set的类
    // class Person {
    //     _name: string
    //     constructor(name: string) {  
    //         this._name = name
    //     }

    //     getName(): string { 
    //         return this._name
    //     }
    //     setName(name: string): void {
    //         this._name = name;
    //     }
    // }

    // let p = new Person('张三')
    // // console.log(p.getName());
    // p.setName('袁天罡')
    // console.log(p.getName());


    // #ts 实现继承

    // class Person {
    //     _name: string
    //     constructor(name: string) {
    //         this._name = name
    //     }
    //     run(): void {
    //         console.log(`${this._name} is running!`);
    //     }
    // }

    // // 使用extends 继承父类，同时要使用super函数调用父类的构造函数
    // class Web extends Person{
    //     constructor(name:string){
    //         super(name)
    //     }    
    //     work(){
    //         console.log(this._name+ ' is training');            
    //     }    
    // }

    // let w=new Web('圆圆');
    // w.run();
    // w.work();

    // ts 继承的探讨 父类的方法和子类的方法一致
    // class Person {
    //     _name: string
    //     constructor(name: string) {
    //         this._name = name
    //     }
    //     run(): void {
    //         console.log(`${this._name} is running!`);
    //     }
    // }

    // 使用extends 继承父类，同时要使用super函数调用父类的构造函数
    // 当子类中方法和父类方法一致时，会覆盖父类中的方法
    // class Web extends Person {
    //     constructor(name: string) {
    //         super(name)
    //     }
    //     work() {
    //         console.log(this._name + ' is training');
    //     }
    //     run(): void {
    //         console.log('子类的 ' + this._name + ' is running');

    //     }
    // }

    // let w = new Web('圆圆');
    // w.run();

    // #ts 类的访问修饰符：public,protected,private
    // public: 公共，完全开放，子类，外部类都可以访问
    // protected: 保护，部分开放，子类可以访问，限制外部类访问
    // private: 私有，完全不开放，仅供自己类内访问，限制子类和外部类访问
    // 不加修饰符，默认就是public

    // static 声明静态属性、方法，使用类名调用静态成员
    // 静态方法里不能使用this关键字调用非静态成员
    // class Person {
    //     _name: string
    //     static Age: number = 0;
    //     constructor(name: string) {
    //         this._name = name
    //     }
    //     run(): void {
    //         console.log(`${this._name} is running!`);
    //     }
    //     static Pring() {
    //         console.log('this is a static function: ' + Person.Age);
    //     }
    // }
    // Person.Age = 20;
    // Person.Pring();

    // 继承的多态：父类定义方法不去实现，让继承的子类去实现方法体，不同的子类有不同的表现就叫多态
    // class Voice {
    //     _name: string
    //     constructor(name: string) {
    //         this._name = name
    //     }
    //     makeVoice() { }
    // }
    // class Speaker extends Voice {
    //     constructor(name: string) {
    //         super(name);
    //     }
    //     makeVoice(): void {
    //         console.log(this._name + ' is a speaker');
    //     }
    // }
    // class Singer extends Voice {
    //     constructor(name: string) {
    //         super(name);
    //     }
    //     makeVoice(): void {
    //         console.log(this._name + ' is a Singer');
    //     }
    // }
    // let sp = new Speaker('Teller');
    // let sn = new Singer('Seller');
    // sp.makeVoice();
    // sn.makeVoice();

    // abstract 声明抽象类、抽象方法
    // ts 中的抽象类是为派生类提供标准结构的基类，不能被实例化
    // 抽象方法不包含具体实例，并且必需在派生类中被实现，抽象方法只能在抽象类中定义
    // 抽象类的派生类必需实现基类的抽象方法，可以把抽象方法看做一种往下分发的标准
    // abstract class Voice {
    //     _name: string
    //     constructor(name:string){
    //         this._name=name
    //     }
    //     abstract makeVoice():any
    // }
    // class Speaker extends Voice {
    //     constructor(name: string) {
    //         super(name);
    //     }
    //     makeVoice(): void {
    //         console.log(this._name + ' is a speaker');
    //     }
    // }
    // let sp=new Speaker('张三');
    // sp.makeVoice();
}


